Skip to content

Conversation

@ehearne-redhat
Copy link
Contributor

@ehearne-redhat ehearne-redhat commented Nov 1, 2025

Summary

  • Adds new /jira:backlog command to help developers find suitable JIRA tickets from the backlog to work on
  • Intelligently analyzes unassigned tickets and bot-assigned tickets, selecting the 2 best candidates from each priority level (Critical, High, Normal, Low)
  • Uses direct curl API calls instead of MCP commands to avoid 413 errors and token limits with large datasets

Key Features

Smart Filtering:

  • Only shows tickets that are actually available (unassigned or assigned to bots)
  • Excludes tickets claimed by real people, even if they have stale activity

Intelligent Analysis:

  • Reads ticket descriptions, comments, and activity patterns
  • Evaluates ticket suitability based on recency, clarity, impact, and activity
  • Prioritizes fresher tickets (< 60 days) to ensure relevance
  • Flags tickets that need verification before work can start

Performance:

  • Fetches up to 1000 tickets per request using JIRA's REST API
  • Streams responses directly to disk to avoid memory/token issues
  • Successfully tested with 2,535 tickets without hitting Claude's limits
  • No 413 errors or excessive context consumption

Comprehensive Documentation:

  • Detailed prerequisites with MCP configuration examples
  • Step-by-step implementation guide
  • Error handling for common authentication/configuration issues
  • Multiple examples with different use cases

Command Syntax

/jira:backlog [project-key] [--assignee username] [--days-inactive N]

Examples

# Find unassigned tickets in OCPBUGS
/jira:backlog OCPBUGS

# Find stale tickets with custom threshold
/jira:backlog OCPBUGS --days-inactive 14

# Find stale tickets for specific user
/jira:backlog OCPBUGS --assignee jsmith --days-inactive 30

Test plan

  • Verify command structure follows plugin conventions
  • Test with large dataset (OCPBUGS - 2,535 tickets)
  • Confirm no 413 errors or token limit issues
  • Validate intelligent ticket selection across priority levels
  • Run make lint to validate plugin structure
  • Test command execution in Claude Code
  • Verify MCP credential extraction works correctly
  • Test error handling for missing/invalid credentials

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added /jira:backlog command to discover backlog items filtered by project, assignee, and inactivity status.
    • Added /jira:create-release-note command to automatically generate release notes from Jira issues and linked pull requests.
  • Documentation

    • Added comprehensive command documentation and usage guides.

@openshift-ci openshift-ci bot requested review from brandisher and zaneb November 1, 2025 19:27
@ehearne-redhat
Copy link
Contributor Author

/retest

ehearne-redhat and others added 2 commits November 1, 2025 19:38
Regenerate PLUGINS.md and docs/data.json to include the new
jira:backlog command in the plugin documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@ehearne-redhat
Copy link
Contributor Author

Forgive the messy commits - the branch was made when the PLUGINS.md test wasn't introduced.

@brandisher
Copy link

/assign

@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Nov 6, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 6, 2025

Walkthrough

Documents a new Jira backlog discovery command with project-key and optional assignee/inactivity filters. Adds command entries to PLUGINS.md and docs/data.json, then provides comprehensive implementation documentation detailing credential handling, JQL construction, ticket filtering, and multi-priority analysis logic.

Changes

Cohort / File(s) Summary
Documentation updates
PLUGINS.md, plugins/jira/commands/backlog.md
Adds new /jira:backlog command documentation with synopsis, usage instructions, configuration, implementation workflow, error handling, and examples. Defines command to discover suitable backlog tickets by priority and activity.
Command registry
docs/data.json
Registers two Jira plugin commands: backlog (with project-key, --assignee, --days-inactive options) and create-release-note (with issue-key argument) as public command entities.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

  • Verify command signature consistency across PLUGINS.md, docs/data.json, and backlog.md
  • Review argument definitions and option names for correctness
  • Check documentation completeness and clarity of error handling scenarios
  • Confirm command registry entries match implementation specifications

Pre-merge checks and finishing touches

Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
No Real People Names In Style References ❓ Inconclusive Repository files referenced in the PR summary could not be accessed to verify compliance with real people names style reference restrictions. Provide access to modified files (PLUGINS.md, docs/data.json, plugins/jira/commands/backlog.md) to verify no real people names are used as style references.
✅ Passed checks (6 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately and concisely summarizes the main change: adding a new /jira:backlog command to find suitable tickets from backlog, which aligns with all file modifications (PLUGINS.md, docs/data.json, and backlog.md documentation).
Docstring Coverage ✅ Passed Docstring coverage is 85.71% which is sufficient. The required threshold is 80.00%.
No Assumed Git Remote Names ✅ Passed No hardcoded git remote names like 'origin' or 'upstream' found in PR files; changes contain only Jira command documentation and configuration.
Git Push Safety Rules ✅ Passed No git push operations, force push commands, or autonomous push instructions found in PR changes.
No Untrusted Mcp Servers ✅ Passed Pull request adds jira:backlog command documentation without introducing untrusted MCP server installations or unsafe external dependencies.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between a310149 and 9894458.

📒 Files selected for processing (2)
  • PLUGINS.md (1 hunks)
  • docs/data.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/data.json
🔇 Additional comments (1)
PLUGINS.md (1)

101-101: ✓ Duplicate /jira:backlog entry has been resolved.

The previously flagged duplicate has been removed, and the /jira:backlog command now appears correctly at line 101 as the sole entry for this command. The command signature, parameters, and description are properly formatted and consistent with the established PLUGINS.md style.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (1)
plugins/jira/commands/backlog.md (1)

384-384: Replace over-used intensifier "very" with more precise language.

Lines 384 and 529 use "very old" and "very large" respectively (EN_WEAK_ADJECTIVE linting flag).

Apply these diffs for more precise language:

- Zero comments AND very old (120+ days) - likely abandoned
+ Zero comments AND aged 120+ days - likely abandoned

- **Parallel-safe:** Can process very large backlogs (10,000+ tickets) without issues
+ **Parallel-safe:** Can process large backlogs (10,000+ tickets) without issues

Also applies to: 529-529

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between b536984 and 91f3701.

📒 Files selected for processing (3)
  • PLUGINS.md (1 hunks)
  • docs/data.json (1 hunks)
  • plugins/jira/commands/backlog.md (1 hunks)
🧰 Additional context used
🪛 Gitleaks (8.28.0)
plugins/jira/commands/backlog.md

[high] 511-511: Discovered a potential authorization token provided in a curl command header, which could compromise the curl accessed resource.

(curl-auth-header)

🪛 LanguageTool
plugins/jira/commands/backlog.md

[style] ~384-~384: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...lready complete) - Zero comments AND very old (120+ days) - likely abandoned - Com...

(EN_WEAK_ADJECTIVE)


[style] ~529-~529: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...limits - Parallel-safe: Can process very large backlogs (10,000+ tickets) without issu...

(EN_WEAK_ADJECTIVE)

🪛 markdownlint-cli2 (0.18.1)
plugins/jira/commands/backlog.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


80-80: Bare URL used

(MD034, no-bare-urls)


81-81: Bare URL used

(MD034, no-bare-urls)


141-141: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


172-172: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


233-233: Code block style
Expected: fenced; Actual: indented

(MD046, code-block-style)


267-267: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


342-342: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


343-343: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


413-413: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


483-483: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


493-493: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


504-504: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (10)
PLUGINS.md (1)

98-98: LGTM—command entry correctly placed and formatted.

The new /jira:backlog command entry follows the same format as other Jira commands and is positioned before /jira:create as expected. The command syntax and description are clear.

docs/data.json (1)

76-81: LGTM—metadata entry is valid and consistent.

The JSON structure is well-formed and values align with the PLUGINS.md entry. The command is correctly positioned before create in the Jira plugin's command array. Both synopsis and argument_hint match the documented syntax.

plugins/jira/commands/backlog.md (8)

1-12: LGTM—frontmatter and synopsis are well-structured.

The YAML frontmatter, command name, and synopsis sections are correctly formatted and match the entries in PLUGINS.md and docs/data.json.


14-35: LGTM—description clearly explains command purpose and differentiates from simple filtering.

The description effectively communicates that this command performs intelligent analysis rather than simple filtering, which is an important distinction. The key features section and use cases are well-articulated.


36-152: LGTM—prerequisites and MCP configuration section is thorough and actionable.

The prerequisites are comprehensive, with clear explanations of:

  • Why direct curl is used instead of MCP (avoiding 413 errors and token limits)
  • Required configuration file format with all necessary fields
  • Field descriptions with links to token generation pages
  • Container setup with podman including commands for managing the container
  • Verification steps with helpful error diagnostics

This level of detail will help users set up the command correctly.


153-267: LGTM—implementation workflow is detailed and logical.

The step-by-step implementation section clearly outlines:

  • Credential extraction from MCP config (steps 1–2)
  • Argument parsing and validation (step 2)
  • JQL query construction with proper filtering (step 3)
  • Batched ticket retrieval with pagination and error handling (step 4)
  • The batch processing loop correctly implements pagination with proper status tracking

The explanation for why curl is used instead of MCP is justified and well-documented.


275-349: LGTM—Python filtering logic and batch processing strategy is sound.

The Python processing script correctly:

  • Loads all batch files using glob patterns
  • Filters for available tickets (unassigned or bot-assigned)
  • Groups by normalized priority levels
  • Handles priority name variations (Critical/Blocker, High/Major, Normal/Medium, Low/Minor/Trivial)
  • Saves both filtered results and statistics

This approach ensures clean data for the subsequent analysis phase.


350-409: LGTM—intelligent ticket analysis strategy emphasizes human judgment over mechanical selection.

The analysis approach is well-conceived with:

  • Clear distinction that this is NOT automated selection (critical emphasis on line 352)
  • Structured classification of ticket age (Very Fresh through Very Old)
  • Disqualifying factors that prevent invalid recommendations
  • Positive indicators for suitable tickets
  • Selection criteria ranked by importance (recency > clarity > impact > activity)
  • Requirement to document reasoning for each selection

This prevents the risk of recommending inappropriate tickets and ensures the command serves as a true assistant rather than just automation.


410-480: LGTM—output format and error handling are comprehensive.

The report format includes:

  • Search criteria summary for reproducibility
  • Organization by priority with count for each level
  • Per-ticket details including status, updates, reporter, components, labels
  • Context summary, recent activity, and recommendations
  • Next steps guiding users to related commands (/jira:grooming, /jira:solve)

Error handling covers all major failure modes:

  • Missing credentials file
  • Incomplete credentials
  • Authentication failures with recovery steps
  • Invalid project keys
  • No tickets found with suggestions for adjustment
  • curl and jq failures
  • Rate limiting with backoff strategy

534-584: LGTM—examples, arguments section, and return values are clear and complete.

The examples demonstrate:

  • Basic usage (OCPBUGS project)
  • Custom inactivity threshold
  • User-specific filtering
  • Usage across different projects
  • Real performance metrics from testing (2,535 tickets, no 413 errors)

The arguments section documents:

  • Required project-key with format requirements (uppercase, optional hyphens)
  • Optional --assignee filter with defaults
  • Optional --days-inactive threshold with sensible defaults

Return values clearly list all outputs including intermediate files, optional final report, and statistics.

jira:backlog

## Synopsis
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add language specifiers to all fenced code blocks for markdown compliance.

Multiple code blocks lack language identifiers (MD040). This affects syntax highlighting and linting compliance.

Apply these diffs to specify languages:

- ```
+ ```bash

For Python blocks (around lines 283–339):

- ```python
+ ```python

For JSON blocks (around lines 60–75, 329–335, 538–542):

- ```
+ ```json

For JQL blocks (around lines 189–198):

- ```jql
+ ```jql

All code blocks should follow the format:

```language
code here
```

Also applies to: 141-141, 172-172, 267-267, 413-413, 483-483, 493-493, 504-504

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around lines 10, 60–75, 141, 172, 189–198,
267, 283–339, 329–335, 413, 483, 493, 504, and 538–542: several fenced code
blocks are missing language specifiers (MD040). Edit each triple-backtick fence
to include the appropriate language identifier — e.g., ```bash for shell
examples at line 10 and others, ```python for the Python blocks around 283–339,
```json for JSON blocks at 60–75, 329–335 and 538–542, and ```jql for the JQL
block at 189–198 — and update the remaining listed lines (141, 172, 267, 413,
483, 493, 504) to include their correct language tags so all fenced code blocks
include a language identifier.

Comment on lines +80 to +81
- `JIRA_API_TOKEN`: Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens
- `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Wrap bare URLs in markdown syntax to comply with linting standards.

Lines 80–81 contain bare URLs that should be wrapped in angle brackets or markdown link syntax to pass linting checks.

Apply this diff:

- `JIRA_API_TOKEN`: Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens
- `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens
+ `JIRA_API_TOKEN`: Atlassian API token from <https://id.atlassian.com/manage-profile/security/api-tokens>
+ `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from <https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- `JIRA_API_TOKEN`: Atlassian API token from https://id.atlassian.com/manage-profile/security/api-tokens
- `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens
- `JIRA_API_TOKEN`: Atlassian API token from <https://id.atlassian.com/manage-profile/security/api-tokens>
- `JIRA_PERSONAL_TOKEN`: Red Hat JIRA Personal Access Token from <https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens>
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

80-80: Bare URL used

(MD034, no-bare-urls)


81-81: Bare URL used

(MD034, no-bare-urls)

🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around lines 80 to 81, the two bare URLs
must be wrapped in markdown link syntax or angle brackets to satisfy linting:
replace the plain URLs with either
<https://id.atlassian.com/manage-profile/security/api-tokens> and
<https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens>
or convert them to descriptive links like [Atlassian API
token](https://id.atlassian.com/manage-profile/security/api-tokens) and [Red Hat
JIRA Personal Access
Token](https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens).

maxResults=1000&\
fields=summary,status,priority,assignee,reporter,created,updated,description,labels,components,watches,comment"
# Fetch batch using curl with Bearer token authentication
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use fenced code blocks with language specifier instead of indented blocks.

Line 233 uses indented code block format. The markdown linter (MD046) requires fenced blocks with language specification.

Convert to fenced block:

-   **Batch Processing Loop:**
-   ```bash
+   **Batch Processing Loop:**
+
+   ```bash

This applies to the indented code example around line 233 that should be converted to a fenced block with bash language identifier.

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

233-233: Code block style
Expected: fenced; Actual: indented

(MD046, code-block-style)

🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around line 233 the example uses an indented
code block; update it to a fenced code block with a language specifier by
replacing the indented block with a triple-backtick fence and the language tag
"bash" (```bash) before the snippet and a closing triple-backtick after, and
ensure any preceding/contextual bullets like "Batch Processing Loop" remain
plain text above the fenced block.

Comment on lines +342 to +343
- `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority
- `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix list indentation to comply with MD007 linting rule.

Lines 342–343 have incorrect indentation for unordered list items (expected 0, actual 3).

Apply this diff to fix indentation:

-   **Outputs:**
-   - `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority
-   - `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics
+   **Outputs:**
+
+   - `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority
+   - `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority
- `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics
**Outputs:**
- `.work/jira-backlog/{project-key}/filtered.json` - All filtered tickets grouped by priority
- `.work/jira-backlog/{project-key}/stats.json` - Priority distribution statistics
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

342-342: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


343-343: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)

🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around lines 342 to 343, the unordered list
items are indented with 3 spaces which violates MD007 (expect 0); remove the
leading spaces so each list item starts at column 0 (no leading spaces) and keep
the dash, space, and text intact so the two lines become top-level list entries.

1. Check that JIRA_PERSONAL_TOKEN is correct and not expired
2. Verify JIRA_USERNAME matches your JIRA account
3. Ensure JIRA_URL is correct (e.g., https://issues.redhat.com)
4. Test authentication: curl -H "Authorization: Bearer YOUR_TOKEN" YOUR_JIRA_URL/rest/api/2/myself
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Remove or anonymize the curl authentication header example to avoid potential security issues.

The curl command on line 511 (in the error handling section) shows an Authorization: Bearer header pattern. While this is a documentation example with placeholder text, the gitleaks tool flags this as a potential token exposure risk.

Apply this diff to address the security linting concern:

- 4. Test authentication: curl -H "Authorization: Bearer YOUR_TOKEN" YOUR_JIRA_URL/rest/api/2/myself
+ 4. Test authentication: `curl -u username:token https://YOUR_JIRA_URL/rest/api/2/myself` (or use Bearer token in header)

Alternatively, move the example to a code block and clearly mark it as pseudocode:

- Test authentication: curl -H "Authorization: Bearer YOUR_TOKEN" YOUR_JIRA_URL/rest/api/2/myself
+ Test authentication with Bearer token (replace placeholders):
+   ```bash
+   curl -H "Authorization: Bearer <YOUR_JIRA_PERSONAL_TOKEN>" \
+     https://<YOUR_JIRA_URL>/rest/api/2/myself
+   ```

This keeps the documentation useful while addressing the security scan concern by using proper code block formatting and clearer placeholder notation.

🧰 Tools
🪛 Gitleaks (8.28.0)

[high] 511-511: Discovered a potential authorization token provided in a curl command header, which could compromise the curl accessed resource.

(curl-auth-header)

🤖 Prompt for AI Agents
In plugins/jira/commands/backlog.md around line 511, the example curl command
exposes an Authorization: Bearer pattern that triggers security scanners;
replace the inline example with a clearly anonymized code-block example using a
placeholder token and URL (e.g., Authorization: Bearer
<YOUR_JIRA_PERSONAL_TOKEN> and https://<YOUR_JIRA_URL>/rest/api/2/myself) or
remove the header entirely so the documentation no longer contains a raw bearer
pattern; ensure the example is wrapped in a fenced code block and labeled as
pseudocode/bash.

stbenjam and others added 18 commits November 6, 2025 16:10
- Sort plugins alphabetically
- Implement autocomplete dropdown showing plugins, commands, and skills
- Add README button to plugin modal headers
- Filter and display search results in organized sections
- Support keyboard and click-outside handlers for autocomplete
Bootstrap an initial set of ethical guidelines. The first focused on
establishing clear guidance around referencing people.

Additional may be added as needs are identified.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Add comprehensive OVN Northbound database analysis for interconnect
mode clusters using ovsdb-tool to query binary database files.

Assisted-by: Claude <[email protected]>
Signed-off-by: Patryk Diak <[email protected]>
This command automates creating PRs to add wait steps to OpenShift CI
workflows, enabling QE to debug test failures by pausing execution and
allowing SSH access to the test environment.

Key features:
- Prioritizes job config modifications over workflow modifications
- Uses OCP version to search correct job config files (e.g., release-4.21)
- Adds wait step before last test step (allowing setup steps to complete)
- Auto-commits and auto-pushes changes
- Minimal user prompts (only initial inputs + multi-file selection)
- Clear impact warnings (job config vs workflow scope)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Add new command to automatically generate bug fix release notes by analyzing Jira bugs and their linked GitHub PRs. The command extracts Cause and Consequence from the bug description, analyzes PR content, and updates the Jira ticket with a synthesized release note.

This automation saves time and ensures consistent release note quality across all bugs by analyzing multiple sources: PR descriptions, commit messages, code changes, and PR comments.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Add detailed implementation skill providing step-by-step guidance for generating release notes. The skill covers:
- Parsing bug descriptions for Cause/Consequence
- Extracting and analyzing GitHub PRs
- Synthesizing information into cohesive release notes
- Security validation and error handling

This skill ensures consistent, high-quality implementation of the create-release-note command.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Add documentation for the new create-release-note command to the Jira plugin README. Includes usage examples, prerequisites, and sample output.

This helps users understand how to use the new release note generation feature.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Update PLUGINS.md and docs/data.json to reflect the new create-release-note command.

Generated files are kept in sync with plugin metadata to ensure accurate documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Address feedback from @stbenjam to improve GitHub PR discovery logic:

- Add explicit warnings against using `gh issue view` with Jira keys
- Prioritize searching Jira remote links first (primary source)
- Add fallback search using `gh pr list --search` for common repos
- Provide user confirmation workflow for found PRs
- Update both command and skill documentation with clear examples

This prevents the error where the command tried to use Jira keys as GitHub issue numbers, which fails because they are different identifiers.

Fixes: openshift-eng#99 (comment)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Add optional timeout parameter (1h-72h) to customize wait duration
in CI debugging jobs. Defaults to 3h when omitted.

Implementation includes:
- Fixed Python section boundary detection for test: section
- Timeout normalized to Go duration format (e.g., "8h" → "8h0m0s")
- Added best_effort: true when timeout is customized
Regenerate PLUGINS.md and docs/data.json to include the new
jira:backlog command in the plugin documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@openshift-ci
Copy link

openshift-ci bot commented Nov 6, 2025

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: ehearne-redhat
Once this PR has been reviewed and has the lgtm label, please ask for approval from brandisher. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

bryan-cox and others added 4 commits November 6, 2025 16:23
Update PLUGINS.md and docs/data.json to reflect the new create-release-note command.

Generated files are kept in sync with plugin metadata to ensure accurate documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Regenerate PLUGINS.md and docs/data.json to include the new
jira:backlog command in the plugin documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Update PLUGINS.md and docs/data.json to reflect the new create-release-note command.

Generated files are kept in sync with plugin metadata to ensure accurate documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Regenerate PLUGINS.md and docs/data.json to include the new
jira:backlog command in the plugin documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
plugins/must-gather/README.md (1)

345-345: Update outdated command example to current syntax.

Line 345 contains an outdated example using /analyze-mg command. This should be updated to the current /must-gather:analyze command syntax.

Apply this diff:

 ### Complete Cluster Analysis

-\`\`\`
-/analyze-mg ./must-gather.local.5464029130631179436
-\`\`\`
+\`\`\`
+/must-gather:analyze ./must-gather.local.5464029130631179436
+\`\`\`
🧹 Nitpick comments (22)
plugins/openshift/commands/create-cluster.md (3)

350-359: Recommend secure file permissions for GCP service account key.

The service account key file created on line 355 should have restrictive permissions to prevent unauthorized access. Consider adding explicit permission management in the documentation or script.

Add a note or explicit permission-setting step after key creation:

  echo "Creating service account key..."
  gcloud iam service-accounts keys create "$KEY_FILE" \
     --iam-account="$SERVICE_ACCOUNT_EMAIL"
+ chmod 600 "$KEY_FILE"
  
  echo "Service account key saved to: $KEY_FILE"

Additionally, consider adding a security note in the documentation: "The key file contains sensitive credentials. Ensure the file has restricted permissions (readable only by the user) and never commit it to version control."


297-301: Add validation for Kerberos ID input.

Line 299 states "Validate it's not empty" but the validation logic is not shown in the implementation. Provide concrete validation code.

Add explicit validation after prompting for Kerberos ID:

  2. **Prompt for Kerberos ID**:
     - Ask: "Please provide your Kerberos ID (e.g., jsmith):"
     - Store as `$KERBEROS_ID`
-    - Validate it's not empty
+    - Validate it's not empty:
+      ```bash
+      while [ -z "$KERBEROS_ID" ]; do
+          echo "Error: Kerberos ID cannot be empty."
+          read -p "Please provide your Kerberos ID (e.g., jsmith): " KERBEROS_ID
+      done
+      ```

264-280: Ensure clear separation and context for GCP service account options.

The two options (existing vs. new service account) are presented well, but the documentation could more clearly state which option is recommended for first-time users and provide early validation of prerequisites.

Consider adding introductory guidance:

  If the platform is GCP, the installer requires a service account JSON file with appropriate permissions. Present the user with two options:
  
  1. **Use an existing service account JSON file**
  2. **Create a new service account**
  
  **Ask the user**: "Do you want to use an existing service account JSON file or create a new one?"
+ 
+ **Recommendation**: If you already have a GCP service account configured with the necessary permissions, select option 1. Otherwise, select option 2 and ensure you have the `gcloud` CLI installed and are authenticated to your GCP project.

This guides users toward the correct choice without adding complexity.

plugins/openshift/commands/expand-test-case.md (1)

10-12: Specify language for fenced code block.

Line 10 opens a fenced code block without a language identifier. This aids syntax highlighting and follows markdown best practices.

 ## Synopsis
-```
+```bash
 /openshift:expand-test-case [test-idea-or-file-or-commands] [format]
-```
+```
plugins/openshift/commands/cluster-health-check.md (2)

10-12: Specify language for fenced code blocks.

Several code blocks lack language identifiers. Add bash, json, or appropriate language to aid readability and syntax highlighting (lines 10, 422, 427, 455, 460).

Example fix for line 10:

 ## Synopsis
-```
+```bash
 /openshift:cluster-health-check [--verbose] [--output-format json|text]
-```
+```

538-538: Remove redundant phrase.

Line 538 contains the redundant phrase "point in time." Consider using simply "The command checks cluster state at a given time" or "The command checks cluster state; transient issues may not be detected."

plugins/openshift/commands/review-test-cases.md (1)

10-12: Specify language for fenced code block.

Line 10 opens a fenced code block without a language identifier.

 ## Synopsis
-```
+```bash
 /openshift:review-test-cases [file-path-or-test-code-or-commands]
-```
+```
.coderabbit.yaml (1)

47-80: Consider graduated enforcement for Git Push Safety Rules.

The git push safety rules are critical (no pushes to main/master, no force pushes), but the "ask before any push" requirement may be overly strict for feature branch workflows. Consider whether warning mode might be more suitable for user confirmation reminders, reserving error for the more critical main/master and force-push restrictions.

plugins/jira/README.md (2)

204-210: Specify language for code block showing release note format.

The code block at line 204 lacks a language identifier. Use a language hint (could be text or a markup language if appropriate) for consistency.

 **Release Note Format:**
-```
+```text
 Cause: <extracted from bug description>

219-233: Specify language for example output code block.

The code block at line 219 should include a language identifier. Since this is example output/text, use text or bash:

 **Example Output:**
-```
+```text
 ✓ Release Note Created for OCPBUGS-38358
plugins/ci/commands/query-test-result.md (2)

10-10: Specify language for all fenced code blocks to improve markdown compliance.

Multiple code blocks lack language specifiers. Use bash for shell commands, python for Python, and json for JSON examples. This improves readability and enables syntax highlighting.

Example fixes:

  • Line 10: \`````bash`
  • Line 42-54: Already has \``python` ✓
  • Line 56-60: Missing specifier, should be \``json`
  • Lines 139-146, 154-186, 191-227: Should be \``(no output language) ortext`

Also applies to: 42-42, 56-56, 73-73, 139-139, 154-154, 161-161, 168-168, 175-175, 182-182, 191-191


245-247: Wrap bare URLs as markdown links in "See Also" section.

Bare URLs should be wrapped as markdown links per MD034 rule. Lines 245-247 contain unlinked URLs.

Apply this diff to fix:

## See Also

-- Sippy UI (Production): https://sippy.dptools.openshift.org/sippy-ng/
-- Sippy UI (QE): https://qe-component-readiness.dptools.openshift.org
-- Sippy API Documentation: https://github.com/openshift/sippy
+- [Sippy UI (Production)](https://sippy.dptools.openshift.org/sippy-ng/)
+- [Sippy UI (QE)](https://qe-component-readiness.dptools.openshift.org)
+- [Sippy API Documentation](https://github.com/openshift/sippy)
plugins/must-gather/commands/analyze.md (1)

82-82: Specify language for bash code block.

Line 82 contains a fenced code block without a language specifier. Should be \``bash`.

Apply this diff:

 **Script Availability Check:**

 Before running any analysis, first verify:
-\`\`\`bash
+\`\`\`bash
 ls plugins/must-gather/skills/must-gather-analyzer/scripts/analyze_clusteroperators.py
 \`\`\`
plugins/ci/commands/list-unstable-tests.md (1)

31-31: Specify language for all fenced code blocks to improve markdown compliance.

Multiple code blocks lack language specifiers throughout the file. Use bash for shell commands and python or json for data formats.

Example fixes:

  • Line 31, 42, 48, 56, 73: Should be \``pythonor```json` depending on content
  • Line 114, 121, 126, 135: Should be \``` (plain text) or appropriate language
  • Line 153, 171: Should be \``ortext`

Also applies to: 42-42, 48-48, 56-56, 73-73, 114-114, 121-121, 126-126, 135-135, 153-153, 171-171

plugins/jira/skills/create-release-note/SKILL.md (1)

31-31: Specify language for all fenced code blocks throughout the file.

This large documentation file contains numerous code blocks without language specifiers. Apply language identifiers for consistency and syntax highlighting. Use:

  • bash for shell commands
  • json for JSON examples
  • python for Python code snippets
  • Leave blank for plain text/terminal output if needed

This applies to approximately 30 code blocks throughout the file. Most significantly impact readability in the implementation steps and examples sections.

Also applies to: 56-56, 73-73, 126-126, 135-135, 153-153, 171-171, 209-209, 234-234, 250-250, 382-382, 393-393, 403-403, 421-421, 433-433, 444-444, 457-457, 473-473, 532-532, 588-588, 621-621, 638-638, 652-652, 661-661, 671-671, 689-689, 708-708, 740-740, 765-765

plugins/ci/commands/add-debug-wait.md (4)

608-608: Use heading syntax instead of bold emphasis for error sections.

Lines 608, 618, 628, 641, and 648 use bold text (emphasis) for section headers, but should use markdown headings. This violates MD036 rule and reduces document structure clarity.

Apply this diff to fix:

-### Step 7: Push and Show GitHub Link
+### Step 7: Push and Show GitHub Link

-**Error: Repository Not Found**
+### Error: Repository Not Found

-**Error: Not in openshift/release Repo**
+### Error: Not in openshift/release Repo

-**Error: Workflow File Not Found**
+### Error: Workflow File Not Found

-**Error: Wait Step Already Exists**
+### Error: Wait Step Already Exists

-**Error: Invalid OCP Version**
+### Error: Invalid OCP Version

-### Error: Invalid Timeout Format
+### Error: Invalid Timeout Format

Also applies to: 618-618, 628-628, 641-641, 648-648


305-305: Use hyphenated adjective "user-provided".

Lines 305 and 342 use "user provided" as an adjective modifying "timeout parameter". This should be hyphenated as "user-provided" per English grammar rules.

Apply this diff:

-2. **With custom timeout** (user provided timeout parameter):
+2. **With custom timeout** (user-provided timeout parameter):

Also applies to: 342-342


409-496: Specify language identifier for Python code blocks.

Lines 409-496 and 510-581 contain Python function definitions that should be marked with the python language identifier for proper syntax highlighting.

Apply this diff:

-\`\`\`
+\`\`\`python
 def add_wait_step_to_job_config(file_path, job_name, timeout=None):
     """
     Add '- ref: wait' before the last step in the job's test: section

Also applies to: 510-581


10-12: Add language specifiers to remaining code blocks.

Many code blocks throughout the file lack language specifiers (MD040 violations). Lines 10, 36-41, 43-54, 55-81, 104-127, and others should specify bash, yaml, json, or text as appropriate.

Also applies to: 36-41, 43-54, 55-81, 104-127, 128-186, 187-209

plugins/must-gather/commands/ovn-dbs.md (1)

10-10: Specify language for all fenced code blocks.

Multiple code blocks throughout the file lack language specifiers (MD040 violations). Use bash for shell commands, yaml for YAML output, and json for JSON queries.

Examples:

  • Line 10, 133, 139, 145, 151, 157, 163, 169, 175: Should be \``bash` for command examples
  • Line 36, 50, 68, 87: Should be \``bash` for directory structure and commands
  • Line 189, 195, 202: Should be \``` (plain text) for error messages

Also applies to: 36-36, 50-50, 68-68, 87-87, 133-133, 139-139, 145-145, 151-151, 157-157, 163-163, 169-169, 175-175, 189-189, 195-195, 202-202

plugins/must-gather/README.md (1)

26-26: Specify language for bash code blocks.

Multiple code blocks throughout the file lack the bash language specifier for shell commands. Add ```bash to lines: 26, 27, 47, 62, 84, 101, 114, 164, 189, 211, 234, 245, 252.

Also applies to: 27-27, 47-47, 62-62, 84-84, 101-101, 114-114, 164-164, 189-189, 211-211, 234-234, 245-245, 252-252

plugins/jira/commands/create-release-note.md (1)

10-12: Add fenced-code languages for lint compliance.

markdownlint (MD040) is flagging the plain triple-backtick blocks—starting here and repeating throughout the doc. Please add appropriate language hints (e.g., ```bash, ```json, ```text) so the documentation passes lint and renders with highlighting.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between 91f3701 and a310149.

📒 Files selected for processing (20)
  • .coderabbit.yaml (1 hunks)
  • AGENTS.md (3 hunks)
  • PLUGINS.md (4 hunks)
  • README.md (1 hunks)
  • docs/data.json (7 hunks)
  • docs/index.html (10 hunks)
  • plugins/ci/commands/add-debug-wait.md (1 hunks)
  • plugins/ci/commands/list-unstable-tests.md (1 hunks)
  • plugins/ci/commands/query-test-result.md (1 hunks)
  • plugins/jira/README.md (2 hunks)
  • plugins/jira/commands/create-release-note.md (1 hunks)
  • plugins/jira/skills/create-release-note/SKILL.md (1 hunks)
  • plugins/must-gather/README.md (4 hunks)
  • plugins/must-gather/commands/analyze.md (6 hunks)
  • plugins/must-gather/commands/ovn-dbs.md (1 hunks)
  • plugins/must-gather/skills/must-gather-analyzer/scripts/analyze_ovn_dbs.py (1 hunks)
  • plugins/openshift/commands/cluster-health-check.md (1 hunks)
  • plugins/openshift/commands/create-cluster.md (3 hunks)
  • plugins/openshift/commands/expand-test-case.md (1 hunks)
  • plugins/openshift/commands/review-test-cases.md (1 hunks)
🧰 Additional context used
🪛 LanguageTool
plugins/jira/commands/create-release-note.md

[style] ~194-~194: The double modal “Required Known” is nonstandard (only accepted in certain dialects). Consider “to be Known”.
Context: ...GS) - Release Note Not Required - Known Issue - Enhancement - Rebase -...

(NEEDS_FIXED)


[style] ~509-~509: The double modal “Requires read” is nonstandard (only accepted in certain dialects). Consider “to be read”.
Context: ...d) for setup instructions - Requires read/write permissions for bugs 2. **GitHub...

(NEEDS_FIXED)

plugins/ci/commands/add-debug-wait.md

[grammar] ~305-~305: Use a hyphen to join words.
Context: ...hours) 2. With custom timeout (user provided timeout parameter): ```yaml ...

(QB_NEW_EN_HYPHEN)


[grammar] ~342-~342: Use a hyphen to join words.
Context: ...hours) 2. With custom timeout (user provided timeout parameter): ```yaml ...

(QB_NEW_EN_HYPHEN)


[style] ~794-~794: ‘by mistake’ might be wordy. Consider a shorter alternative.
Context: ...pr` - Revert a debug PR that was merged by mistake

(EN_WORDINESS_PREMIUM_BY_MISTAKE)

plugins/ci/commands/query-test-result.md

[uncategorized] ~117-~117: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...ith proper spacing - Present URLs as markdown links for easy clicking ## Return Valu...

(MARKDOWN_NNP)


[uncategorized] ~133-~133: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...(brief name) - Clickable Prow URL (as markdown link or plain URL) - Failed Prow URLs s...

(MARKDOWN_NNP)

plugins/jira/skills/create-release-note/SKILL.md

[style] ~560-~560: The double modal “Required Known” is nonstandard (only accepted in certain dialects). Consider “to be Known”.
Context: ...Bug Fix 2. Release Note Not Required 3. Known Issue 4. Enhancement 5. Rebase 6. Techn...

(NEEDS_FIXED)


[style] ~582-~582: Consider using a different verb for a more formal wording.
Context: ...wn issues**: - If PRs don't actually fix the issue, just document it → Suggest "...

(FIX_RESOLVE)

plugins/openshift/commands/cluster-health-check.md

[style] ~538-~538: This phrase is redundant. Consider writing “point” or “time”.
Context: ...- The command checks cluster state at a point in time; transient issues may not be detected -...

(MOMENT_IN_TIME)

plugins/openshift/commands/expand-test-case.md

[uncategorized] ~54-~54: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... memory, disk pressure, network issues, rate limiting - Concurrency: Multiple operations ...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

🪛 markdownlint-cli2 (0.18.1)
plugins/openshift/commands/review-test-cases.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


51-51: Bare URL used

(MD034, no-bare-urls)

plugins/must-gather/commands/ovn-dbs.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


36-36: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


50-50: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


87-87: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


133-133: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


139-139: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


145-145: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


151-151: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


157-157: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


163-163: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


169-169: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


175-175: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


189-189: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


195-195: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


202-202: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/jira/commands/create-release-note.md

31-31: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


48-48: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


56-56: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


73-73: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


126-126: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


135-135: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


153-153: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


171-171: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


209-209: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


234-234: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


250-250: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


382-382: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


393-393: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


403-403: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


421-421: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


433-433: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


444-444: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


457-457: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


473-473: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


532-532: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/must-gather/commands/analyze.md

82-82: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/ci/commands/add-debug-wait.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


36-36: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


43-43: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


55-55: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


64-64: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


104-104: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


115-115: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


128-128: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


147-147: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


160-160: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


171-171: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


212-212: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


224-224: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


261-261: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


273-273: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


316-316: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


353-353: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


363-363: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


591-591: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


608-608: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


609-609: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


618-618: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


619-619: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


628-628: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


629-629: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


641-641: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


642-642: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


648-648: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


649-649: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


658-658: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


687-687: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


710-710: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


742-742: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/ci/commands/list-unstable-tests.md

31-31: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


48-48: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


56-56: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


73-73: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


126-126: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


135-135: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


153-153: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


171-171: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/ci/commands/query-test-result.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


139-139: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


154-154: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


161-161: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


168-168: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


175-175: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


182-182: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


191-191: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


245-245: Bare URL used

(MD034, no-bare-urls)


246-246: Bare URL used

(MD034, no-bare-urls)


247-247: Bare URL used

(MD034, no-bare-urls)

plugins/jira/README.md

204-204: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


219-219: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/jira/skills/create-release-note/SKILL.md

31-31: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


48-48: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


56-56: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


73-73: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


126-126: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


135-135: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


153-153: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


171-171: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


209-209: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


234-234: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


250-250: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


382-382: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


393-393: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


403-403: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


421-421: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


433-433: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


444-444: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


457-457: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


473-473: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


532-532: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


588-588: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


621-621: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


638-638: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


652-652: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


661-661: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


671-671: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


689-689: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


708-708: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


740-740: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


765-765: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/must-gather/README.md

126-126: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


234-234: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


245-245: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


252-252: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

plugins/openshift/commands/cluster-health-check.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


30-30: Bare URL used

(MD034, no-bare-urls)


31-31: Bare URL used

(MD034, no-bare-urls)


422-422: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


427-427: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


455-455: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


460-460: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


532-532: Bare URL used

(MD034, no-bare-urls)


533-533: Bare URL used

(MD034, no-bare-urls)

plugins/openshift/commands/expand-test-case.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


59-59: Bare URL used

(MD034, no-bare-urls)


60-60: Bare URL used

(MD034, no-bare-urls)


61-61: Bare URL used

(MD034, no-bare-urls)


62-62: Bare URL used

(MD034, no-bare-urls)

🪛 Ruff (0.14.3)
plugins/must-gather/skills/must-gather-analyzer/scripts/analyze_ovn_dbs.py

29-29: PEP 484 prohibits implicit Optional

Convert to T | None

(RUF013)


35-35: PEP 484 prohibits implicit Optional

Convert to T | None

(RUF013)


35-35: PEP 484 prohibits implicit Optional

Convert to T | None

(RUF013)


52-52: subprocess call: check for execution of untrusted input

(S603)


53-53: Starting a process with a partial executable path

(S607)


66-66: Do not catch blind exception: Exception

(BLE001)


99-99: Do not catch blind exception: Exception

(BLE001)


119-119: Uses of tarfile.extractall()

(S202)


315-315: f-string without any placeholders

Remove extraneous f prefix

(F541)


331-331: subprocess call: check for execution of untrusted input

(S603)


332-332: Starting a process with a partial executable path

(S607)


350-350: Do not catch blind exception: Exception

(BLE001)


356-356: PEP 484 prohibits implicit Optional

Convert to T | None

(RUF013)


380-380: f-string without any placeholders

Remove extraneous f prefix

(F541)


431-431: Starting a process with a partial executable path

(S607)

🔇 Additional comments (8)
README.md (1)

99-118: Ethical guidelines well-integrated into plugin development guidance.

The Ethical Guidelines section is clearly written with strong rationale and concrete examples. The placement under Plugin Development is appropriate and the provided examples effectively demonstrate how to describe qualities explicitly.

AGENTS.md (1)

290-330: Ethical guidelines consistently integrated into agent workflows.

The ethics section is well-aligned with README.md guidance and appropriately integrated into both command implementation (line 321) and SKILL.md writing (line 330) procedural checklists. Placement in the "Best Practices for AI Agents" section provides clear expectations for developers.

.coderabbit.yaml (1)

1-104: CodeRabbit configuration is well-structured and strategically focused.

The configuration enforces four critical policies (real-person references, git safety, MCP security, assumed git remotes) that align with the PR's ethical and security objectives. All checks are set to error mode, which is appropriate for foundational policies.

docs/index.html (4)

44-53: Fixed navbar implementation improves discoverability.

The fixed navbar with search, stats, and navigation links enhances the marketplace experience. Proper z-index layering (1000) ensures correct stacking context above content and modals.


160-266: Autocomplete dropdown provides excellent search UX.

The autocomplete implementation with sectioned results (Plugins, Commands, Skills), keyboard-friendly design, and hover states significantly improves searchability. The empty-state message is user-friendly and the CSS styling is consistent with the existing design system.


475-519: Responsive design breakpoints handle multiple viewports effectively.

The media queries at 968px and 480px adapt the navbar layout and grid appropriately for tablets and mobile devices. Flexbox reflow handles stat label visibility and navigation link wrapping gracefully.


921-982: Search algorithm efficiently filters across plugins, commands, and skills.

The searchAndShowAutocomplete() function performs case-insensitive substring matching across multiple fields and aggregates results by type. The filtered plugin set maintains the full UI rendering while autocomplete shows detailed matches—good UX pattern.

plugins/jira/README.md (1)

184-236: Release note feature well-documented with clear workflow and examples.

The new /jira:create-release-note command documentation is thorough, following the established pattern from other Jira commands. The Release Note Format and Example Output sections provide clear guidance on expected behavior and output structure. Prerequisites are explicit about required tools and permissions.

Comment on lines 118 to 120
with tarfile.open(tarball, 'r:gz') as tar:
tar.extractall(path=network_logs)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Harden tar extraction against path traversal.

tar.extractall() runs on untrusted must-gather archives without any member validation. Python’s own docs warn that extraction can write outside network_logs, and recent tarfile CVEs show that even the newer filters (filter="data") can be bypassed.(docs.python.org) Please defensively check each member before extraction (reject absolute/.. paths and symlinks that escape the target) or use a hardened extractor.

Suggested patch:

@@
-        with tarfile.open(tarball, 'r:gz') as tar:
-            tar.extractall(path=network_logs)
+        with tarfile.open(tarball, 'r:gz') as tar:
+            safe_base = network_logs.resolve()
+            members = []
+            for member in tar.getmembers():
+                target_path = (safe_base / member.name).resolve()
+                if not str(target_path).startswith(str(safe_base) + os.sep):
+                    raise ValueError(f"Refusing to extract {member.name}: escapes {safe_base}")
+                if member.islnk() or member.issym():
+                    raise ValueError(f"Refusing to extract link {member.name}: unsafe for analysis")
+                members.append(member)
+            tar.extractall(path=safe_base, members=members)

(Feel free to factor the safety checks into a helper for reuse.)

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Ruff (0.14.3)

119-119: Uses of tarfile.extractall()

(S202)

Comment on lines 309 to 323
echo "Creating service account: $SERVICE_ACCOUNT_NAME"
gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" --display-name="$SERVICE_ACCOUNT_NAME"
```

5. **Extract service account details**:
```bash
# Get service account information
SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')"
SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")"

echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL"
echo "Project ID: $PROJECT_ID"
```

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add error handling for service account creation and validation.

The script creates a service account but doesn't verify success before attempting to extract its details. Additionally, there's no handling if a service account with that name already exists, and no validation that the user has IAM permissions to create service accounts.

Add validation after service account creation and before extraction:

  echo "Creating service account: $SERVICE_ACCOUNT_NAME"
  gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" --display-name="$SERVICE_ACCOUNT_NAME"
+ if [ $? -ne 0 ]; then
+     echo "Error: Failed to create service account. Check that you have 'iam.serviceAccountAdmin' role."
+     exit 1
+ fi
  
- # Get service account information
- SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')"
+ # Get service account information
+ SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r --arg account "$SERVICE_ACCOUNT_NAME" '.[] | select(.email | contains($account))')"
+ if [ -z "$SERVICE_ACCOUNT_JSON" ]; then
+     echo "Error: Service account was created but could not be found in listing."
+     exit 1
+ fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
echo "Creating service account: $SERVICE_ACCOUNT_NAME"
gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" --display-name="$SERVICE_ACCOUNT_NAME"
```
5. **Extract service account details**:
```bash
# Get service account information
SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')"
SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")"
echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL"
echo "Project ID: $PROJECT_ID"
```
echo "Creating service account: $SERVICE_ACCOUNT_NAME"
gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME" --display-name="$SERVICE_ACCOUNT_NAME"
if [ $? -ne 0 ]; then
echo "Error: Failed to create service account. Check that you have 'iam.serviceAccountAdmin' role."
exit 1
fi
5. **Extract service account details**:
🤖 Prompt for AI Agents
In plugins/openshift/commands/create-cluster.md around lines 309 to 323, the
script creates a service account but does not verify success, handle "already
exists" cases, or validate IAM permissions before trying to read its details;
update the flow to check the exit status of the gcloud create command and fail
fast with a clear error if it returns non-zero, detect and treat an existing
service account as an acceptable state (skip creation and continue) by querying
for the specific service account email/name rather than listing all accounts,
validate the current user has iam.serviceAccounts.create (or equivalent)
permission before creating (and error out with guidance if missing), and only
proceed to extract SERVICE_ACCOUNT_JSON, SERVICE_ACCOUNT_EMAIL, and PROJECT_ID
after confirming the service account exists (and otherwise exit with a
descriptive error).

Comment on lines 316 to 322
SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')"
SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")"

echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL"
echo "Project ID: $PROJECT_ID"
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix jq syntax error in service account extraction.

The jq filter on line 316 uses invalid interpolation syntax. The expression match("/\(env.SERVICE_ACCOUNT_NAME)@") is not valid jq; the \(env.SERVICE_ACCOUNT_NAME) pattern won't interpolate the shell variable. Additionally, gcloud iam service-accounts list output uses .email (not .name) for the account email.

Apply this fix:

- SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')"
- SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
- PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")"
+ SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r --arg account "$SERVICE_ACCOUNT_NAME" '.[] | select(.email | contains($account))')"
+ SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
+ PROJECT_ID="$(gcloud config get-value project)"

Note: gcloud config get-value project is the standard way to retrieve the project ID; it's simpler than extracting from service account JSON.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r '.[] | select(.name | match("/\(env.SERVICE_ACCOUNT_NAME)@"))')"
SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
PROJECT_ID="$(jq -r .projectId <<< "$SERVICE_ACCOUNT_JSON")"
echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL"
echo "Project ID: $PROJECT_ID"
```
SERVICE_ACCOUNT_JSON="$(gcloud iam service-accounts list --format json | jq -r --arg account "$SERVICE_ACCOUNT_NAME" '.[] | select(.email | contains($account))')"
SERVICE_ACCOUNT_EMAIL="$(jq -r .email <<< "$SERVICE_ACCOUNT_JSON")"
PROJECT_ID="$(gcloud config get-value project)"
echo "Service Account Email: $SERVICE_ACCOUNT_EMAIL"
echo "Project ID: $PROJECT_ID"
🤖 Prompt for AI Agents
plugins/openshift/commands/create-cluster.md lines 316-322: the jq filter uses
invalid interpolation and checks .name instead of .email; replace the extraction
so jq matches on the service account email (not .name) and pass the shell
variable into jq properly (use jq --arg or env var support) to select the
correct object by .email, then extract .email and .projectId from that object;
also simplify PROJECT_ID by using gcloud config get-value project instead of
parsing the service account JSON.

Comment on lines 328 to 344
while IFS= read -r ROLE_TO_ADD ; do
echo "Adding role: $ROLE_TO_ADD"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--condition="None" \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="$ROLE_TO_ADD"
done << 'END_OF_ROLES'
roles/compute.admin
roles/iam.securityAdmin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountKeyAdmin
roles/iam.serviceAccountUser
roles/storage.admin
roles/dns.admin
roles/compute.loadBalancerAdmin
roles/iam.roleAdmin
END_OF_ROLES
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add error handling for IAM role assignment loop.

The role-assignment loop lacks error handling. If a role assignment fails (e.g., due to insufficient permissions or invalid role), the script continues silently without reporting the failure.

Add error checking within the role assignment loop:

  while IFS= read -r ROLE_TO_ADD ; do
     echo "Adding role: $ROLE_TO_ADD"
     gcloud projects add-iam-policy-binding "$PROJECT_ID" \
        --condition="None" \
        --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
        --role="$ROLE_TO_ADD"
+    if [ $? -ne 0 ]; then
+        echo "Warning: Failed to add role $ROLE_TO_ADD. This may cause installation to fail later."
+    fi
  done << 'END_OF_ROLES'

Alternatively, if any role failure should be fatal, exit immediately with || exit 1.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
while IFS= read -r ROLE_TO_ADD ; do
echo "Adding role: $ROLE_TO_ADD"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--condition="None" \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="$ROLE_TO_ADD"
done << 'END_OF_ROLES'
roles/compute.admin
roles/iam.securityAdmin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountKeyAdmin
roles/iam.serviceAccountUser
roles/storage.admin
roles/dns.admin
roles/compute.loadBalancerAdmin
roles/iam.roleAdmin
END_OF_ROLES
while IFS= read -r ROLE_TO_ADD ; do
echo "Adding role: $ROLE_TO_ADD"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--condition="None" \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="$ROLE_TO_ADD"
if [ $? -ne 0 ]; then
echo "Warning: Failed to add role $ROLE_TO_ADD. This may cause installation to fail later."
fi
done << 'END_OF_ROLES'
roles/compute.admin
roles/iam.securityAdmin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountKeyAdmin
roles/iam.serviceAccountUser
roles/storage.admin
roles/dns.admin
roles/compute.loadBalancerAdmin
roles/iam.roleAdmin
END_OF_ROLES
🤖 Prompt for AI Agents
In plugins/openshift/commands/create-cluster.md around lines 328 to 344, the IAM
role-assignment loop currently ignores failures; update the loop to check each
gcloud command's exit status, log a clear error message including the role and
exit code/message on failure, and either continue with a non-zero exit indicator
or abort immediately (e.g., exit 1) depending on desired behavior; ensure the
script captures and surfaces gcloud stderr for diagnostics and use a conditional
(if/then) or || handler after the gcloud invocation to implement the chosen
failure policy.

@openshift-merge-robot openshift-merge-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Nov 6, 2025
@ehearne-redhat
Copy link
Contributor Author

I can remove the massive commit history - the rebase via CLI didn't work, so I resolved via the GH Web UI.

@ehearne-redhat
Copy link
Contributor Author

Closing as unclean commit history. Clean PR here --> #130 .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants